home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 June / PCpro_2006_06.ISO / files / freeware / openvip.exe / {app} / SettingsDialog.py < prev    next >
Encoding:
Python Source  |  2003-06-18  |  9.7 KB  |  262 lines

  1. #
  2. # This file is part of OpenVIP (http://openvip.sourceforge.net)
  3. #
  4. # Copyright (C) 2002-2003
  5. # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
  6. #
  7. # This program is licensed under GNU General Public License version 2;
  8. # see file COPYING in the top level directory for details.
  9. #
  10. # $Id: SettingsDialog.py,v 1.18 2003/06/18 16:55:08 vaclavslavik Exp $
  11. #
  12.  
  13. from wxPython.wx import *
  14. import globals, logging, render
  15.  
  16. ID_SAVE = wxNewId()
  17. ID_LOAD = wxNewId()
  18. ID_SLIDER = wxNewId()
  19. ID_PREVIEW = wxNewId()
  20. ID_AUTOPREVIEW = wxNewId()
  21.  
  22. PREVIEW_SIZE = (240, 180)
  23.  
  24. # begin wxGlade: dependencies
  25. # end wxGlade
  26.  
  27. class SettingsDialog(wxDialog):
  28.     """Base class for filters and transitions settings dialogs."""
  29.  
  30.     def __init__(self, *args, **kwds):
  31.         self.plugin_panel = None
  32.         self.hasPreview = True 
  33.         self.makingPreview = False
  34.         self.needsPreview = False
  35.         self.needsPreviewPosChange = False
  36.         # begin wxGlade: SettingsDialog.__init__
  37.         kwds["style"] = wxCAPTION|wxRESIZE_BORDER|wxTHICK_FRAME
  38.         wxDialog.__init__(self, *args, **kwds)
  39.         self.panel = wxPanel(self, -1)
  40.         self.load = wxButton(self, ID_LOAD, "&Load...")
  41.         self.save = wxButton(self, ID_SAVE, "&Save...")
  42.         self.preview = wxStaticBitmap(self, -1, wxNullBitmap)
  43.         self.slider = wxSlider(self, ID_SLIDER, 0, 0, 10, style=wxSL_HORIZONTAL|wxSL_AUTOTICKS)
  44.         self.autopreview = wxCheckBox(self, ID_AUTOPREVIEW, "&Automatic preview")
  45.         self.btn_preview = wxButton(self, ID_PREVIEW, "&Preview")
  46.         self.ok = wxButton(self, wxID_OK, "OK")
  47.         self.cancel = wxButton(self, wxID_CANCEL, "Cancel")
  48.  
  49.         self.__set_properties()
  50.         self.__do_layout()
  51.         # end wxGlade
  52.         EVT_BUTTON(self, ID_PREVIEW, self.OnPreview)
  53.         EVT_CHECKBOX(self, ID_AUTOPREVIEW, self.OnAutoPreviewChange)
  54.         EVT_BUTTON(self, ID_SAVE, self.OnSave)
  55.         EVT_BUTTON(self, ID_LOAD, self.OnLoad)
  56.         EVT_COMMAND_SCROLL(self, ID_SLIDER, self.OnPreviewPosChange)
  57.         render.EVT_RENDERING_DONE(self, self.OnPreviewRendered)
  58.         
  59.     def SetPreview(self, hasPreview):
  60.         """Call SetPreview(True) to show preview of applied filter.
  61.            (Derived class should call this, it doesn't make sense for
  62.            e.g. audio filters.) If set to true then derived class must
  63.            implement GeneratePreview(self,params) and
  64.            ChangePreviewPosition(self,pos) methods."""
  65.         self.hasPreview = hasPreview
  66.         self.autopreview.Show(hasPreview)
  67.         self.btn_preview.Show(hasPreview)
  68.         self.preview.Show(hasPreview)
  69.         self.slider.Show(hasPreview)
  70.         self.__do_layout()
  71.  
  72.     def __set_properties(self):
  73.         # begin wxGlade: SettingsDialog.__set_properties
  74.         self.SetTitle("Settings")
  75.         self.autopreview.SetValue(1)
  76.         self.ok.SetDefault()
  77.         # end wxGlade
  78.         self.SetTitle(self.GetTitle())
  79.         self.preview.SetSize(PREVIEW_SIZE)
  80.         self.autopreview.SetValue(
  81.             wxConfigBase_Get().ReadInt('/SettingsDialog/autopreview', 0))
  82.         self.OnAutoPreviewChange(None)
  83.  
  84.     def __do_layout(self):
  85.         # begin wxGlade: SettingsDialog.__do_layout
  86.         sizer_1 = wxBoxSizer(wxHORIZONTAL)
  87.         sizer_2 = wxBoxSizer(wxVERTICAL)
  88.         sizer_3 = wxBoxSizer(wxHORIZONTAL)
  89.         sizer_4 = wxBoxSizer(wxHORIZONTAL)
  90.         sizer_5 = wxBoxSizer(wxVERTICAL)
  91.         sizer_6 = wxBoxSizer(wxHORIZONTAL)
  92.         sizer_5.Add(self.panel, 1, wxALL|wxEXPAND, 5)
  93.         sizer_6.Add(self.load, 0, 0, 0)
  94.         sizer_6.Add(self.save, 0, wxLEFT, 5)
  95.         sizer_5.Add(sizer_6, 0, wxALL|wxEXPAND, 5)
  96.         sizer_1.Add(sizer_5, 1, wxEXPAND, 0)
  97.         sizer_2.Add(self.preview, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5)
  98.         sizer_2.Add(self.slider, 0, wxEXPAND, 0)
  99.         sizer_4.Add(self.autopreview, 1, 0, 0)
  100.         sizer_4.Add(self.btn_preview, 0, 0, 0)
  101.         sizer_2.Add(sizer_4, 0, wxTOP|wxBOTTOM|wxEXPAND, 5)
  102.         sizer_2.Add(20, 20, 1, 0, 0)
  103.         sizer_3.Add(self.ok, 0, wxRIGHT, 5)
  104.         sizer_3.Add(self.cancel, 0, 0, 0)
  105.         sizer_2.Add(sizer_3, 0, wxTOP|wxALIGN_RIGHT, 5)
  106.         sizer_1.Add(sizer_2, 0, wxALL|wxEXPAND, 5)
  107.         self.SetAutoLayout(1)
  108.         self.SetSizer(sizer_1)
  109.         sizer_1.Fit(self)
  110.         sizer_1.SetSizeHints(self)
  111.         self.Layout()
  112.         # end wxGlade
  113.  
  114.     def LoadContent(self, plugin):
  115.         """Loads settings dialog for plugin 'plugin'."""
  116.         classname=None
  117.         try:
  118.             try:
  119.                 exec 'import settings_dlgs.%s%s' % (plugin, self.GetClass())
  120.                 classname=plugin+self.GetClass()
  121.             except ImportError:
  122.                 exec 'import settings_dlgs.%s' % plugin
  123.                 classname=plugin
  124.         except ImportError:
  125.             wxLogError("No settings available for '%s'." % plugin)
  126.             return False
  127.         try:
  128.             panel = eval('settings_dlgs.%s.getPanel(self,self.panel)' % classname)
  129.         except NameError:
  130.             wxLogError("No settings available for '%s'." % plugin)
  131.             return False
  132.         psizer = wxBoxSizer(wxHORIZONTAL)
  133.         psizer.Add(panel, 1, wxEXPAND)
  134.         self.panel.SetAutoLayout(1)
  135.         self.panel.SetSizer(psizer)
  136.         psizer.Fit(self.panel)
  137.         psizer.SetSizeHints(self.panel)
  138.         self.panel.Layout()
  139.         self.__do_layout()
  140.         self.SetTitle('%s: %s' % (self.GetTitle(), plugin))
  141.         self.plugin = plugin
  142.         self.plugin_panel = panel
  143.         panel.SetParams({})
  144.         return True
  145.  
  146.     def SetParams(self, p):
  147.         """Called to set parameters. p is dictionary with strings."""
  148.         self.plugin_panel.SetParams(p)
  149.         self.UpdatePreview(force=True)
  150.  
  151.     def GetParams(self):
  152.         """Returns current parameters."""
  153.         return self.plugin_panel.GetParams()
  154.         
  155.     def OnAutoPreviewChange(self, event):
  156.         self.btn_preview.Enable(not self.autopreview.GetValue())
  157.         wxConfigBase_Get().WriteInt('/SettingsDialog/autopreview',
  158.                                 self.autopreview.GetValue())
  159.         if self.autopreview.GetValue():
  160.             self.UpdatePreview()
  161.  
  162.     def OnPreview(self, event):
  163.         self.UpdatePreview(force=True)
  164.  
  165.     def UpdatePreview(self, force=False):
  166.         """Updates the preview. Called when some parameter changes."""
  167.         if self.plugin_panel == None: return
  168.         if force or self.autopreview.GetValue():
  169.             if self.makingPreview:
  170.                 self.needsPreview = True
  171.                 return
  172.             self.needsPreview = False
  173.             self.makingPreview = True
  174.             p = self.GetParams()
  175.             self.btn_preview.Enable(False)
  176.             self.GeneratePreview(p)
  177.  
  178.     def OnPreviewPosChange(self, event):
  179.         if self.makingPreview:
  180.             self.needsPreviewPosChange = True
  181.             return
  182.         self.needsPreviewPosChange = False
  183.         self.makingPreview = True
  184.         self.ChangePreviewPosition(self.slider.GetValue())
  185.  
  186.     def OnPreviewRendered(self, event):
  187.         if event.data != None:
  188.             img = wxEmptyImage(PREVIEW_SIZE[0], PREVIEW_SIZE[1])
  189.             img.SetData(event.data)
  190.             bmp = wxBitmapFromImage(img)
  191.             self.preview.SetBitmap(bmp)
  192.         self.btn_preview.Enable(not self.autopreview.GetValue())
  193.         self.makingPreview = False
  194.         if self.needsPreviewPosChange:
  195.             self.OnPreviewPosChange(None)
  196.         if self.needsPreview:
  197.             self.UpdatePreview(force=True)
  198.  
  199.     def WaitUntilNotUsed(self):
  200.         if self.makingPreview:
  201.             self.needsPreviewPosChange = False
  202.             self.needsPreview = False
  203.             busy = wxBusyCursor()
  204.             while self.makingPreview:
  205.                 wxYield()
  206.  
  207.     def OnSave(self, event):
  208.         ret = wxFileSelector('Save plugin settings',
  209.                              wildcard='OpenVIP plugin settings (*.xml)|*.xml',
  210.                              flags=wxSAVE|wxOVERWRITE_PROMPT)
  211.         if ret == '': return
  212.         file = '<?xml version="1.0" ?>\n'
  213.         file += '<settings class="%s" name="%s">\n' % (self.GetClass(),
  214.                                                        self.plugin)
  215.         par = self.plugin_panel.GetParams()
  216.         for p in par:
  217.             file += '    <param name="%s">%s</param>\n' % (p, par[p])
  218.         file += '</settings>\n'
  219.         f = open(ret, 'wt')
  220.         f.write(file)
  221.         f.close()
  222.        
  223.     def OnLoad(self, event):
  224.         file = wxFileSelector('Load plugin settings',
  225.                               wildcard='OpenVIP plugin settings (*.xml)|*.xml',
  226.                               flags=wxOPEN|wxFILE_MUST_EXIST)
  227.         if file == '': return
  228.         import xml.dom.minidom
  229.         doc = xml.dom.minidom.parse(file)
  230.         if doc.documentElement.nodeName != 'settings':
  231.             wxLogError('Not OpenVIP XML settings file')
  232.             return
  233.         if doc.documentElement.getAttribute('class') != self.GetClass() or \
  234.            doc.documentElement.getAttribute('name') != self.plugin:
  235.                wxLogError("File '%s' does not contain settings for '%s'" % (file, self.plugin))
  236.                return
  237.         params = {}
  238.         for node in doc.getElementsByTagName('param'):
  239.             params[node.getAttribute('name')] = node.firstChild.data
  240.         self.plugin_panel.SetParams(params)
  241.             
  242.  
  243.     # -----------------------------------------------------------------
  244.     # Override these methods to get working xxxSettingsClass:
  245.     # -----------------------------------------------------------------
  246.  
  247.     def GetClass(self):
  248.         """Derived class must override this to provide class suffix
  249.            (e.g. VFilter, AFilter)"""
  250.         pass        
  251.  
  252.     def GetTitle(self):
  253.         """Returns dialog's title"""
  254.         return 'Settings'
  255.  
  256.     def GeneratePreview(self, params):
  257.         """Called to generate preview. See SetPreview."""
  258.         pass
  259.  
  260. # end of class SettingsDialog
  261.  
  262.